package com.road7.mina.customcodecfactory;

import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
import org.apache.mina.filter.codec.ProtocolDecoderOutput;

import com.road7.mina.pb.student.StudentMsgProto;

/**
 * @Description :
 * @FileName: ProtobufStrictDecoder.java
 * @Author :WeiHui.Zhang
 * @Data : 2015年11月23日 下午8:27:49
 * @Version:V1.00
 */
public class ProtobufStrictDecoder extends CumulativeProtocolDecoder {

	@Override
	protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {
		// 如果没有接收完Header部分（4字节），直接返回false
		if (in.remaining() < 4) {
			return false;
		} else {
			// 标记开始位置，如果一条消息没传输完成则返回到这个位置
			in.mark();
			// 读取header部分，获取body长度
			int bodyLength = in.getInt();
			// 如果body没有接收完整，直接返回false
			if (in.remaining() < bodyLength) {
				return false;
			} else {
				byte[] bodyBytes = new byte[bodyLength];
				in.get(bodyBytes);
				StudentMsgProto.StudentRspMsg student = StudentMsgProto.StudentRspMsg.parseFrom(bodyBytes); // 将body中protobuf字节码转成Student对象
				out.write(student); // 解析出一条消息
				return true;
			}
		}

	}

}
